package api;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import api.Regla.ObjetoAfectado;

public class ConsultaReglasRMI extends UnicastRemoteObject implements IConsultaReglasRMI{

	private static final long serialVersionUID = 1L;

	private List<Regla> reglas;
	
	protected ConsultaReglasRMI() throws RemoteException {
		super();
		this.reglas = API.obtenerInstancia().getReglas();		
	}
	
	//TODO: solo para prueba, remover
	public void imprimirAlgo() throws RemoteException {
		System.out.println("Prueba");
	}
	
	public ArrayList<String> obtenerReglas() throws RemoteException {
		ArrayList<String> resultado = new ArrayList<String>();
		
		Iterator<Regla> itR = this.reglas.iterator();
		int i = 0;		
		while(itR.hasNext()) {
			Regla r = itR.next();
			resultado.add(i + " - " + r.getDescripcion());			
			i++;
		}
		return resultado;
	}

	public ArrayList<String> obtenerConfiguracion(int idRegla) throws RemoteException {
		ArrayList<String> resultado = new ArrayList<String>();
		
		Respuesta r = this.reglas.get(idRegla).getRespuesta();
		if (r.verificaOrden()) resultado.add("Verifica orden");
		else resultado.add("No verifica orden");
		if (r.verificaCancelados()) resultado.add("Verifica cancelados");
		else resultado.add("No verifica cancelados");
		if (r.verificaConsecutivos()) resultado.add("Verifica consecutivos");
		else resultado.add("No verifica consecutivos");
		
		return resultado;
	}

	public ArrayList<String> obtenerSucesosNecesarios(int idRegla) throws RemoteException {
		ArrayList<String> resultado = new ArrayList<String>();
		
		List<Suceso> sucesos = this.reglas.get(idRegla).getRespuesta().getSucesosNecesarios();
		Iterator<Suceso> itS = sucesos.iterator();
		while(itS.hasNext()) {
			Suceso s = itS.next();
			resultado.add(s.getDescripcion());
		}
		
		return resultado;
	}

	public ArrayList<String> obtenerObjetosAfectados(int idRegla) throws RemoteException {
		ArrayList<String> resultado = new ArrayList<String>();
		
		List<ObjetoAfectado> objetos = this.reglas.get(idRegla).getObjetosAfectados();
		Iterator<ObjetoAfectado> itO = objetos.iterator();
		while(itO.hasNext()) {
			ObjetoAfectado o = itO.next();
			resultado.add(o.toString());
		}
		
		return resultado;
	}

	public ArrayList<String> obtenerDatos(int idRegla) throws RemoteException {
		ArrayList<String> resultado = new ArrayList<String>();
		resultado.add("Configuracion:\n");
		resultado.addAll(this.obtenerConfiguracion(idRegla));
		resultado.add("\nSucesos necesarios:\n");
		resultado.addAll(this.obtenerSucesosNecesarios(idRegla));
		resultado.add("\nObjetos afectados:\n");
		resultado.addAll(this.obtenerObjetosAfectados(idRegla));
		return resultado;
	}
	
	public void activarRegla(int idRegla) throws java.rmi.RemoteException {
		API.obtenerInstancia().getReglas().get(idRegla).setActivada(true);
	}
	
	public void desactivarRegla(int idRegla) throws java.rmi.RemoteException {
		API.obtenerInstancia().getReglas().get(idRegla).setActivada(false);
	}
	
	public boolean reglaActiva(int idRegla){
		return(API.obtenerInstancia().getReglas().get(idRegla).isActiva());
	}
	
	public void eliminarRegla(int idRegla) throws RemoteException {
		this.reglas.remove(idRegla);
	}
}
